package com.oos.zone.wechat.cp.service.handler;

import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
import me.chanjar.weixin.cp.bean.message.WxCpXmlOutTextMessage;
import me.chanjar.weixin.cp.message.WxCpMessageHandler;

import javax.annotation.Resource;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.Executor;

/**
 * 功能描述：
 *
 * @author 拓金辉
 * @version 1.0
 * @date 2021-07-31 11:40:35
 */
public abstract class AbstractWxCpMessageHandler implements WxCpMessageHandler {

    @Resource
    public Executor executor;
    public WxCpXmlMessage wxMessage;
    public Map<String, Object> context;
    public WxCpService wxCpService;
    public WxSessionManager sessionManager;
    public final WxCpXmlOutTextMessage defaultTextMessage = WxCpXmlOutMessage.TEXT().build();

    /**
     * Handle wx cp xml out message.
     *
     * @param wxMessage      the wx message
     * @param context        上下文，如果handler或interceptor之间有信息要传递，可以用这个
     * @param wxCpService    the wx cp service
     * @param sessionManager the session manager
     * @return xml格式的消息 ，如果在异步规则里处理的话，可以返回null
     */
    @Override
    public final WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map<String, Object> context, WxCpService wxCpService, WxSessionManager sessionManager) {
        this.wxMessage = wxMessage;
        this.context = context;
        this.wxCpService = wxCpService;
        this.sessionManager = sessionManager;
        return Optional.ofNullable(this.doHandle()).orElse(defaultTextMessage);
    }

    /**
     * 方法描述：真正处理业务的方法
     *
     * @return me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage
     * @author 拓金辉
     * @date 2021-07-31 12:49:22
     */
    public abstract WxCpXmlOutMessage doHandle();

    /**
     * 方法描述：获取企业id默认实现
     *
     * @return java.lang.String
     * @author 拓金辉
     * @date 2021-07-31 11:42:35
     */
    public final String corpId() {
        return (String) context.getOrDefault("corpId", null);
    }

    /**
     * 方法描述：获取应用id默认实现
     *
     * @return java.lang.Integer
     * @author 拓金辉
     * @date 2021-07-31 11:41:54
     */
    public final Integer agentId() {
        return (Integer) context.getOrDefault("agentId", null);
    }

}
